package learn.letcode.slidewindow;

import java.util.LinkedList;
import java.util.Random;

public class SlidingTimeWindow {

    /**
     * 最大请求数
     */
    public final int limit = 100;

    /**
     * 服务访问次数
     */
    Long counter = 0L;

    /**
     * 使用linkedlist记录滑动窗口的10个格子
     */
    LinkedList<Long> slots = new LinkedList<>();

    /**
     * 时间划分多少段落
     */
    int split = 10;

    /**
     * 是否限流了,true:限流了，false：允许正常访问。
     */
    boolean isLimit = false;


    private void check() throws InterruptedException {
        while (true){
            slots.addLast(counter);

            /**
             * 超出了，就把第一个移出去
             */
            if (slots.size()>split){
                slots.removeFirst();
            }

            /**
             * 比较最后一个和第一个，两者相差100以上就限流
             */
            if ((slots.peekLast()-slots.peekFirst())>limit){
                System.out.println("限流了");
                isLimit = true;
            }else {
                isLimit = false;
            }

            Thread.sleep(1000/split);

        }
    }

    public static void main(String[] args) throws InterruptedException {

        final SlidingTimeWindow slidingTimeWindow = new SlidingTimeWindow();

        /**
         * 开启一个线程判断当前的限流情况
         */
        new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    slidingTimeWindow.check();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }).start();


        /**
         * 模拟请求
         */
        while (true){
            if (!slidingTimeWindow.isLimit){
                slidingTimeWindow.counter++;
                Thread.sleep(new Random().nextInt(15));
                System.out.println("业务方法执行完了...");
            }else{
                System.out.println("被限流了，直接返回给用户");
            }
        }
    }



}
